<?php
/**
 * Weixin.php
 *
 * tiantashop商城系统 - 团队十年电商经验汇集巨献!
 * =========================================================
 * Copy right 2015-2025 河南甜塔信息技术有限公司, 保留所有权利。
 * ----------------------------------------------
 * 官方网址: http://www.tiantashop.com
 * 这不是一个自由软件！您只能在不用于商业目的的前提下对程序代码进行修改和使用。
 * 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
 * =========================================================
 * @author : tiantateam
 * @date : 2015.4.24
 * @version : v1.0.0.0
 */

namespace data\service;


use think\Exception;
use think\Loader;


class WxPay extends BaseService
{

    public function __construct()
    {
        require_once "wxpay/WxPay.Api.php";
        require_once "wxpay/WxPay.JsApiPay.php";
        require_once "wxpay/WxPay.Config.php";
    }

    /**
     * 微信支付
     * @param $Body 商品描述
     * @param $Attach 附加数据 可作为自定义参数使用
     * @param $Out_trade_no 商户订单号
     * @param $Total_fee 标价金额
     * @param $openid 用户标识
     * @param $Goods_tag订单优惠标记 使用代金券或立减优惠功能时需要的参数
     * @return array|\json数据，可直接填入js函数作为参数
     */
    public function JsApiPay($Body, $Out_trade_no, $Total_fee, $openid, $Attach = '', $Goods_tag = '')
    {
        try {
            $tools = new \JsApiPay();
            $input = new \WxPayUnifiedOrder();
            $input->SetBody($Body);//商品描述
            $input->SetAttach($Attach);//附加数据 可作为自定义参数使用
            $input->SetOut_trade_no($Out_trade_no);//商户订单号
            $input->SetTotal_fee($Total_fee);//标价金额
            $input->SetTime_start(date("YmdHis"));//交易起始时间
            $input->SetTime_expire(date("YmdHis", time() + 600));//交易结束时间
            $input->SetGoods_tag($Goods_tag);//订单优惠标记 使用代金券或立减 优惠功能时需要的参数
            $input->SetTrade_type("JSAPI");//交易类型
            $input->SetOpenid($openid);
            $config = new \WxPayConfig();
            $order = \WxPayApi::unifiedOrder($config, $input);
            if (isset($order['FAIL'])) {
                return ['error' => $order['return_msg']];
            }
            return $jsApiParameters = json_decode($tools->GetJsApiParameters($order), true);
        } catch (\Exception $exception) {
            return ['error' => $exception->getMessage()];
        }
    }



    /**
     * 订单退款
     * @param $out_trade_no
     * @param $total_fee
     * @param $refund_fee
     * @return array|\成功时返回，其他抛异常
     */
    public function refund($out_trade_no, $total_fee, $refund_fee)
    {

        try {
            $config = new \WxPayConfig();
            $input = new \WxPayRefund();
            $input->SetOut_trade_no($out_trade_no);
            $input->SetTotal_fee($total_fee);
            $input->SetRefund_fee($refund_fee);
            $input->SetOut_refund_no("sdkphp" . date("YmdHis"));
            $input->SetOp_user_id($config->GetMerchantId());
            $boole = \WxPayApi::refund($config, $input);
            if ($boole['return_code']=="FAIL") {
                return ['error' => $boole['return_msg']];
            }
            return $boole;
        } catch (\Exception $e) {
            return ['error' => $e->getMessage()];
        }
    }

    /**
     * 订单查询
     * @param $out_trade_no
     * @return array|\成功时返回，其他抛异常
     * @throws \WxPayException
     */
    public function orderquery($out_trade_no)
    {
        try {
            $input = new \WxPayOrderQuery();
            $input->SetOut_trade_no($out_trade_no);
            $config = new \WxPayConfig();
            $boole = \WxPayApi::orderQuery($config, $input);
            if (isset($boole['err_code'])) {
                return ['error' => $boole['err_code_des']];
            }
            return $boole;
        } catch (Exception $e) {
            return ['error' => $e->getMessage()];
        }
    }

}